#ifndef XMLINFOCARACTERISTIQUES_HPP
#define XMLINFOCARACTERISTIQUES_HPP

#include "XmlInfoNom.hpp"

/** Type énuméré décrivant les différentes caractéristiques.
 *
 * En plus des caractéristiques de base, on ajoute ici d'autres valeurs, qui
 * permettent un traitement génériques des contrats et monstres.
 */
enum EnumCaracteristique
{
    CarSadisme     = 0, /**< Représente le score de sadisme. */
    CarLaideur     = 1, /**< Représente le score de laideur. */
    CarForce       = 2, /**< Représente le score de force. */
    CarGourmandise = 3, /**< Représente le score de gourmandise. */

    CarControle    = 4, /**< Représente le score de contrôle. */
    CarDifficulte  = 5, /**< Représente la difficulté d'un contrat. */
    CarTypeContrat = 6  /**< Représente le type de contrat. */
};

/** Classe servant de base à la représentation d'un monstre ou d'un
 * contrat, en effet ces deux "objets" on en commun un score de
 * sadisme, laideur, force et gourmandise.
 *
 * @author Johan "Solo" Luisier
 * @date Octobre 2011
 */
class XmlInfoCaracteristiques : public XmlInfoNom
{
public:
    /** Constructeur standard.
      * Initialise la classe mère et le nom.
      *
      * @param[in] nomFichier nom du fichier XML.
      * @param[in] id identifiant de l'objet.
      * @param[in] nom nom de l'instance.
      * @param[in] sadisme score de sadisme.
      * @param[in] laideur score de laideur.
      * @param[in] force score de force.
      * @param[in] gourmandise score de gourmandise.
      */
    XmlInfoCaracteristiques( const QString& nomFchier,
                             const unsigned& id,
                             const QString& nom,
                             const unsigned& sadisme,
                             const unsigned& laideur,
                             const unsigned& force,
                             const unsigned& gourmandise );
    /**
      * Permet de dupliquer une instance de @c XmlInfoCaracteristique.
      *
      * @param[in] caracterisques instance à dupliquer.
      */
    XmlInfoCaracteristiques( const XmlInfoCaracteristiques& caracterisques );
    /** Destructeur.
      * Le destructeur n'a rien de spécial à faire.
      */
    virtual ~XmlInfoCaracteristiques();
    /** Opérateur d'affectation.
      * Permet de copier le contenu d'une instance dans une autre.
      *
      * @param[in] caracteristiques instance à copier dans l'instance courante.
      *
      * @return une référence sur l'instance courante.
      */
    XmlInfoCaracteristiques& operator=( const XmlInfoCaracteristiques& caracteristiques );
    /** Permet d'accéder au score voulu, pouvant être utilisé dans une boucle.
      *
      * @param[in] car EnumCaracteristique de la compétence voulue.
      *
      * @return une référence constante sur le "trait" voulu.
      */
    virtual const unsigned& caracteristique( const EnumCaracteristique& car ) const;
    /** Permet d'accéder au score voulu, pouvant être utilisé dans une
     * boucle. Cette fois l'argument est de type @c unsigned.
     * Pour s'assurer que la caractéristique voulue a bien un index entre 0 et 3
     * le modulo 4 est pris.
     *
     * @param[in] car "numéro" de la compétence voulue, converti en
     * EnumCaracteristique.
     *
     * @return une référence constante sur le "trait" voulu.
     */
    virtual const unsigned& caracteristique( const unsigned& car ) const;
    /** Permet d'accéder à Sadisme.
      *
      * @return nue référence constante sur Sadisme.
      */
    const unsigned& sadisme() const;
    /** Permet d'accéder à Laideur.
      *
      * @return nue référence constante sur Laideur.
      */
    const unsigned& laideur() const;
    /** Permet d'accéder à Force.
      *
      * @return nue référence constante sur Force.
      */
    const unsigned& force() const;
    /** Permet d'accéder à Gourmandise.
      *
      * @return nue référence constante sur Gourmandise.
      */
    const unsigned& gourmandise() const;
    /** Permet de changer la valeur de Sadisme.
      *
      * @param[in] sadisme nouvelle valeur de Sadisme.
      */
    void setSadisme( const unsigned& sadisme );
    /** Permet de changer la valeur de Laideur.
      *
      * @param[in] laideur nouvelle valeur de Laideur.
      */
    void setLaideur( const unsigned& laideur );
    /** Permet de changer la valeur de Force.
      *
      * @param[in] force nouvelle valeur de Force.
      */
    void setForce( const unsigned& force );
    /** Permet de changer la valeur de Gaurmandise.
      *
      * @param[in] gourmandise nouvelle valeur de Gourmandise.
      */
    void setGourmandise( const unsigned& gourmandise );
protected:
    /** Constructeur par défaut.
      * Appelé lors de la création d'une instance par creeInstance.
      */
    XmlInfoCaracteristiques();
    /**
      * Score de sadisme.
      */
    unsigned Sadisme;
    /**
      * Score de laideur.
      */
    unsigned Laideur;
    /**
      * Score de force.
      */
    unsigned Force;
    /**
      * Score de gourmandise.
      */
    unsigned Gourmandise;
};

#endif // XMLINFOCARACTERISTIQUES_HPP
